Apparently everything downstream assumes callers already handled
interwiki titles.
See also T239466 for related code-hardening.
Bug: T239428
Change-Id: Ie54f366986056c876eade0fcad6c41f70b8b8de8
(cherry picked from commit
9084591e104fc10f004044f552b47ad27e7d763b)
/** @var Title $newTitle */
foreach ( $titles as $id => $newTitle ) {
- $titles[ $id - 1 ] = $titles[ $id - 1 ] ?? $oldTitle;
+ $titles[$id - 1] = $titles[$id - 1] ?? $oldTitle;
$redirValues[] = [
'from' => $titles[$id - 1]->getPrefixedText(),
];
$titleObj = $newTitle;
+
+ // T239428: Check whether the new title is valid
+ if ( $titleObj->isExternal() || !$titleObj->canExist() ) {
+ $redirValues[count( $redirValues ) - 1]['to'] = $titleObj->getFullText();
+ $this->dieWithError(
+ [
+ 'apierror-edit-invalidredirect',
+ Message::plaintextParam( $oldTitle->getPrefixedText() ),
+ Message::plaintextParam( $titleObj->getFullText() ),
+ ],
+ 'edit-invalidredirect',
+ [ 'redirects' => $redirValues ]
+ );
+ }
}
ApiResult::setIndexedTagName( $redirValues, 'r' );
"apierror-csp-report": "Error processing CSP report: $1.",
"apierror-deletedrevs-param-not-1-2": "The <var>$1</var> parameter cannot be used in modes 1 or 2.",
"apierror-deletedrevs-param-not-3": "The <var>$1</var> parameter cannot be used in mode 3.",
+ "apierror-edit-invalidredirect": "Cannot edit <kbd>$1</kbd> while following redirects, as target <kbd>$2</kbd> is not valid.",
"apierror-emptynewsection": "Creating empty new sections is not possible.",
"apierror-emptypage": "Creating new, empty pages is not allowed.",
"apierror-exceptioncaught": "[$1] Exception caught: $2",
"apierror-csp-report": "{{doc-apierror}}\n\nParameters:\n* $1 - Error code, e.g. \"toobig\".",
"apierror-deletedrevs-param-not-1-2": "{{doc-apierror}}\n\nParameters:\n* $1 - Parameter name.\n\nSee also:\n* {{msg-mw|apihelp-query+deletedrevs-extended-description}}",
"apierror-deletedrevs-param-not-3": "{{doc-apierror}}\n\nParameters:\n* $1 - Parameter name.\n\nSee also:\n* {{msg-mw|apihelp-query+deletedrevs-extended-description}}",
+ "apierror-edit-invalidredirect": "{{doc-apierror}}\n\nParameters:\n* $1 - Redirect being edited\n* $2 - Target of the redirect that cannot be edited.",
"apierror-emptynewsection": "{{doc-apierror}}",
"apierror-emptypage": "{{doc-apierror}}",
"apierror-exceptioncaught": "{{doc-apierror}}\n\nParameters:\n* $1 - Exception log ID code. This is meaningless to the end user, but can be used by people with access to the logs to easily find the logged error.\n* $2 - Exception message, which may end with punctuation. Probably in English.",